/**
 * 应用程序引导和服务配置
 * 
 * 职责：
 * 1. 配置 DI 容器
 * 2. 注册所有服务
 * 3. 初始化应用程序
 * 
 * @author AI Assistant
 * @date 2025-11-27
 */

import { container, ServiceIdentifiers } from '../core/di';
import { Log } from '../core/logger/LoggerGlobal';
import { GameConfig } from '../config/GameConfig';

// 导入服务
import { GameApplication } from './GameApplication';
import { SceneCoordinator } from './coordinator/SceneCoordinator';
import { FixedUpdateManager } from './ecs/FixedUpdateManager';
import { CommandQueue } from './ecs/command/CommandQueue';
import { ConfigManager } from '../config/ConfigManager';
import { WorldSystem } from './ecs/worldSystem';

/**
 * 配置所有服务
 */
export function configureServices(): void {
    Log.styled('━'.repeat(60), 'separator');
    Log.styled('📦 配置 DI 容器', 'title');
    Log.styled('━'.repeat(60), 'separator');
    
    // ========== 核心服务 ==========
    Log.styled('🔧 注册核心服务', 'large');
    
    // 配置管理器
    container.registerSingleton(
        ServiceIdentifiers.ConfigManager,
        ConfigManager
    );
    Log.general.debug('  ✓ ConfigManager');
    
    // ========== ECS 服务 ==========
    Log.styled('🎮 注册 ECS 服务', 'large');
    
    // 固定更新管理器（先注册，后面要注入到 WorldSystem）
    container.registerSingleton(
        ServiceIdentifiers.FixedUpdateManager,
        FixedUpdateManager
    );
    Log.general.debug('  ✓ FixedUpdateManager');
    
    // ✅ ECS 世界（使用工厂函数，自动注入 FixedUpdateManager）
    container.registerSingleton(
        ServiceIdentifiers.ECSWorld,
        (c) => {
            const fixedUpdateManager = c.resolve<FixedUpdateManager>(
                ServiceIdentifiers.FixedUpdateManager
            );
            return new WorldSystem(fixedUpdateManager);
        }
    );
    Log.general.debug('  ✓ ECSWorld (单例，依赖注入)');
    
    // 命令队列
    container.registerSingleton(
        ServiceIdentifiers.CommandQueue,
        CommandQueue
    );
    Log.general.debug('  ✓ CommandQueue');
    
    // ========== 场景服务 ==========
    Log.styled('🎬 注册场景服务', 'large');
    
    // 场景协调器
    container.registerSingleton(
        ServiceIdentifiers.SceneCoordinator,
        SceneCoordinator
    );
    Log.general.debug('  ✓ SceneCoordinator');
    
    // ========== 游戏应用 ==========
    Log.styled('🚀 注册游戏应用', 'large');
    
    // 游戏应用（使用工厂函数注入所有依赖）
    container.registerSingleton(
        ServiceIdentifiers.GameApplication,
        (c) => {
            const ecsWorld = c.resolve<WorldSystem>(ServiceIdentifiers.ECSWorld);
            const sceneCoordinator = c.resolve<SceneCoordinator>(ServiceIdentifiers.SceneCoordinator);
            const fixedUpdateManager = c.resolve<FixedUpdateManager>(ServiceIdentifiers.FixedUpdateManager);
            const commandQueue = c.resolve<CommandQueue>(ServiceIdentifiers.CommandQueue);
            
            return new GameApplication(
                ecsWorld,
                sceneCoordinator,
                fixedUpdateManager,
                commandQueue
            );
        }
    );
    Log.general.debug('  ✓ GameApplication (工厂函数)');
    
    // ========== 完成 ==========
    Log.styled('━'.repeat(60), 'separator');
    Log.styled('✅ 服务配置完成', 'success');
    
    // 打印统计信息
    container.printStatistics();
}

/**
 * 清理所有服务
 */
export function cleanupServices(): void {
    Log.styled('━'.repeat(60), 'separator');
    Log.styled('🧹 清理所有服务', 'title');
    Log.styled('━'.repeat(60), 'separator');
    
    container.clear();
    
    Log.styled('✅ 服务清理完成', 'success');
    Log.styled('━'.repeat(60), 'separator');
}

/**
 * 获取服务（便捷方法）
 */
export function getService<T>(identifier: symbol | string): T {
    return container.resolve<T>(identifier);
}

/**
 * 使用示例：
 * 
 * ```typescript
 * // 在 game.ts 中
 * import { configureServices, getService } from './bootstrap';
 * import { ServiceIdentifiers } from '../core/di';
 * 
 * protected async onLoad(): Promise<void> {
 *     // 配置服务
 *     configureServices();
 *     
 *     // 获取游戏应用
 *     const gameApp = getService<GameApplication>(ServiceIdentifiers.GameApplication);
 *     
 *     // 初始化并启动
 *     await gameApp.initialize(this.node);
 *     gameApp.start();
 * }
 * ```
 */

